
package com.svh.Controlador;

import com.svh.Entidad.Marca;
import com.svh.Entidad.Producto;
import com.svh.Entidad.SubtipoProductoMarca;
import com.svh.Paginator.Paginador;
import com.svh.Paginator.SubtipoProductoMarcaPaginator;
import com.svh.Servicios.MigrarServicios;
import com.svh.Servicios.SubtipoProductoMarcaServicio;
import com.svh.Utils.ExcelExporter;
import com.svh.Utils.Exporter;
import com.svh.Utils.Utilitario;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.LazyDataModel;

import org.primefaces.model.UploadedFile;

/**
 *
 * @author David
 */
@ManagedBean(name = "subtipo")
@ViewScoped
public class SubtipoProductoMarcaControlador {

    @ManagedProperty("#{sesionControlador}")
    SesionControlador sesionControlador;
    
    private SubtipoProductoMarcaServicio subtipoProductoMarcaServicio;
    private SubtipoProductoMarca subPM;
    private String precio_aux;
    private List<Producto> lstProducto;
    private List<Marca> lstMarca;
    LazyDataModel<SubtipoProductoMarca> subtipos;
    private UploadedFile file;

    public SubtipoProductoMarcaControlador() {
    }

    public void initInsertar() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            subtipoProductoMarcaServicio = new SubtipoProductoMarcaServicio();
            subPM = new SubtipoProductoMarca();
            subPM.setProducto(new Producto());
            subPM.setMarca(new Marca());                        
            lstProducto = subtipoProductoMarcaServicio.obtenerProductos();
            lstMarca = subtipoProductoMarcaServicio.obtenerMarcas();
        }
    }

    public void initLista() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            subtipos = new Paginador<SubtipoProductoMarca>(new SubtipoProductoMarcaPaginator());
            sesionControlador.generarModulo(7);
        }
    }

    public void initUpdate() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            subtipoProductoMarcaServicio = new SubtipoProductoMarcaServicio();
            Object parametro = Utilitario.getFlash("idSubtipoProductoMarca");
            if (parametro == null) {
                Utilitario.redireccionarJSF(FacesContext.getCurrentInstance(), "/views/subTipo/list.xhtml");
                return;
            }
            subPM = subtipoProductoMarcaServicio.obtenerSubtipoProductoMarcaPorID((Integer) parametro);
            precio_aux = subPM.getPrecio().toString();
            lstProducto = subtipoProductoMarcaServicio.obtenerProductos();
            lstMarca = subtipoProductoMarcaServicio.obtenerMarcas();
        }
    }

    public void registrarSubProducto() {
        if (!esVistaValida()) {
            return;
        }
        subPM.setIdUsuario(sesionControlador.getUsuario().getId());
        subPM.setPrecio(Double.parseDouble(precio_aux));
        subtipoProductoMarcaServicio.registrarSubProducto(subPM);
        subPM = new SubtipoProductoMarca();
    }

    public void actualizar() {
        if (!esVistaValida()) {
            return;
        }
        subPM.setIdUsuario(sesionControlador.getUsuario().getId());
        subPM.setPrecio(Double.parseDouble(precio_aux));
        subtipoProductoMarcaServicio.actualizarSubProducto(subPM);        
    }

    public String irActualizar(int id) {
        Utilitario.putFlash("idSubtipoProductoMarca", id);
        return "update.xhtml?faces-redirect=true";
    }

    /**
     * VALIDACIONES *
     */
    private boolean esVistaValida() {
        boolean resultado = true;
        if (!esProductoValido()) {
            resultado = false;
        } else if (!esMarcaValido()) {
            resultado = false;
        } else if (!esCodigoValido()) {
            resultado = false;
        } else if (!esPrecioValido()) {
            resultado = false;
        }
        return resultado;
    }

    private boolean esProductoValido() {
        boolean resultado = true;
        if (subPM.getProducto().getId() == 0) {
            Utilitario.enviarMensajeGlobalError("Debe selecionar el Producto");
            resultado = false;
        }
        return resultado;
    }

    private boolean esMarcaValido() {
        boolean resultado = true;
        if (subPM.getMarca().getId() == 0) {
            Utilitario.enviarMensajeGlobalError("Debe selecionar la Marca");
            resultado = false;
        }
        return resultado;
    }

    private boolean esCodigoValido() {
        boolean resultado = true;
        if (Utilitario.esNulo(subPM.getCodigo().trim())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresarse el codigo");
            resultado = false;
        } else if (!Utilitario.esRangoValido(subPM.getCodigo(), 11, 20)) {
            Utilitario.enviarMensajeGlobalError("El codigo debe estar en el rango de 11 a 20 caracteres");
            resultado = false;
        } else if (!Utilitario.esAlfaNumerico(subPM.getCodigo())) {
            Utilitario.enviarMensajeGlobalError("Solo se permiten caracteres alfanumericos en el codigo");
            resultado = false;
        }
        return resultado;
    }

    private boolean esPrecioValido() {
        boolean resultado = true;
        if (Utilitario.esNulo(precio_aux.trim())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresarse el Precio");
            resultado = false;
        } else if (Utilitario.esSoloDecimalPositivo(precio_aux)) {
            Utilitario.enviarMensajeGlobalError("El precio debe ser numérico");
            resultado = false;
        } else if (Double.parseDouble(precio_aux) <= 0) {
            Utilitario.enviarMensajeGlobalError("El precio debe ser mayor a 0");
            resultado = false;
        }
        return resultado;
    }

    ///// metodos para funcionar el importar excel
    public void upload() throws IOException {
        if (file != null) {
            if (validarExtensionXls(file.getFileName())) {
                MigrarServicios ms = new MigrarServicios(sesionControlador.getUsuario().getId());
                ms.setInputStream(file.getInputstream());
                ms.migrar(file.getFileName());
            } else {
                Utilitario.enviarMensajeGlobalError("ERROR. Archivo no valido");
            }
        }
    }

    public boolean validarExtensionXls(String nombreArchivo) {
        String extension = nombreArchivo.substring(nombreArchivo.lastIndexOf(".") + 1, nombreArchivo.length());
        if (extension.equalsIgnoreCase("xls") || extension.equalsIgnoreCase("xlsx")) {
            return true;
        } else {
            return false;
        }
    }
    
    public void exportar(){
        List<Exporter> datos = ((Paginador)subtipos).getAllList();
        ExcelExporter da = new ExcelExporter(SubtipoProductoMarca.class);
        da.agregarHeader("Lista de Productos");
        da.crearDocumento(datos);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext = ExcelExporter.getResponseContent(externalContext,"lista_productos_marca");
        try {
            OutputStream outputStream = externalContext.getResponseOutputStream();
            da.exportarDocumento(outputStream);
            externalContext.setResponseStatus(200);
            externalContext.responseFlushBuffer();
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }  
    

    ///// fin metodos para funcionar el importar excel
    /**
     * GETTERS AND SETTERS *
     */
    public SubtipoProductoMarca getSubPM() {
        return subPM;
    }

    public void setSubPM(SubtipoProductoMarca subPM) {
        this.subPM = subPM;
    }

    public SubtipoProductoMarcaServicio getSubtipoProductoMarcaServicio() {
        return subtipoProductoMarcaServicio;
    }

    public void setSubtipoProductoMarcaServicio(SubtipoProductoMarcaServicio subtipoProductoMarcaServicio) {
        this.subtipoProductoMarcaServicio = subtipoProductoMarcaServicio;
    }

    public List<Producto> getLstProducto() {
        return lstProducto;
    }

    public void setLstProducto(List<Producto> lstProducto) {
        this.lstProducto = lstProducto;
    }

    public List<Marca> getLstMarca() {
        return lstMarca;
    }

    public void setLstMarca(List<Marca> lstMarca) {
        this.lstMarca = lstMarca;
    }

    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {
        this.file = file;
    }

    public LazyDataModel<SubtipoProductoMarca> getSubtipos() {
        return subtipos;
    }

    public void setSubtipos(LazyDataModel<SubtipoProductoMarca> subtipos) {
        this.subtipos = subtipos;
    }

    public void setSesionControlador(SesionControlador sesionControlador) {
        this.sesionControlador = sesionControlador;
    }

    public String getPrecio_aux() {
        return precio_aux;
    }

    public void setPrecio_aux(String precio_aux) {
        this.precio_aux = precio_aux;
    }

}
